package com.ruoyi.system.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.dto.ContractPaymentScheduleCreateDTO;
import com.ruoyi.system.dto.ContractPaymentScheduleDTO;
import com.ruoyi.system.dto.ContractPaymentScheduleUpdateDTO;
import com.ruoyi.system.entity.ContractPaymentSchedule;

import java.math.BigDecimal;
import java.util.List;

/**
 * 合同付款周期服务接口
 */
public interface ContractPaymentScheduleService extends IService<ContractPaymentSchedule> {

    /**
     * 根据合同ID获取付款周期列表
     * @param contractId 合同ID
     * @return 付款周期列表
     */
    List<ContractPaymentScheduleDTO> getByContractId(Long contractId);

    /**
     * 创建付款周期
     * @param dto 创建DTO
     * @return 创建的付款周期DTO
     */
    ContractPaymentScheduleDTO create(ContractPaymentScheduleCreateDTO dto);

    /**
     * 批量创建付款周期
     * @param dtos 创建DTO列表
     * @return 创建的付款周期DTO列表
     */
    List<ContractPaymentScheduleDTO> createBatch(List<ContractPaymentScheduleCreateDTO> dtos);

    /**
     * 更新付款周期
     * @param dto 更新DTO
     * @return 更新后的付款周期DTO
     */
    ContractPaymentScheduleDTO update(ContractPaymentScheduleUpdateDTO dto);

    /**
     * 根据ID删除付款周期
     * @param id 付款周期ID
     * @return 删除结果
     */
    boolean deleteById(Long id);

    /**
     * 根据合同ID删除所有付款周期
     * @param contractId 合同ID
     * @return 删除结果
     */
    boolean deleteByContractId(Long contractId);

    /**
     * 更新付款状态
     * @param id 付款周期ID
     * @param paymentStatus 付款状态
     * @param actualPaymentDate 实际付款日期
     * @param actualPaymentAmount 实际付款金额
     * @return 更新结果
     */
    boolean updatePaymentStatus(Long id, Integer paymentStatus, 
                               java.time.LocalDate actualPaymentDate, 
                               BigDecimal actualPaymentAmount);

    /**
     * 统计合同的总付款金额
     * @param contractId 合同ID
     * @return 总付款金额
     */
    BigDecimal getTotalPaymentAmount(Long contractId);

    /**
     * 统计合同的总已付款金额
     * @param contractId 合同ID
     * @return 总已付款金额
     */
    BigDecimal getTotalActualPaymentAmount(Long contractId);

    /**
     * 创建默认付款周期
     * @param contractId 合同ID
     * @param totalAmount 合同总金额
     * @return 创建的付款周期DTO列表
     */
    List<ContractPaymentScheduleDTO> createDefaultPaymentSchedules(Long contractId, BigDecimal totalAmount);
}
